// 引入 操作token的方法
import { getUserDetaiInfoById, getUserInfo, login } from '@/api/user'
import { getToken, setToken, removeToken, setTimeKey } from '@/utils/auth'
import { resetRouter } from '@/router/index'
// import Vue from 'vue'

// 状态
const state = {
  token: getToken(), // 初始化token 设置token初始状态   token持久化 => 放到缓存中
  userInfo: {} // 用户数据
}
// 修改状态
const mutations = {
  // 修改token
  upDateToken(state, token) {
    // 同步数据
    state.token = token
    // 设置本地缓存
    setToken(token)
  },
  // 删除token
  removeToken(state) {
    // 同步数据
    state.token = null
    // 删除本地缓存
    removeToken()
  },
  // 更新获取用户数据
  updateUserInfo(state, results) {
    state.userInfo = results
  },
  // 删除用户数据
  removeUserInfo(state) {
    state.userInfo = {}
  }
}
// 执行异步
const actions = {
  // 登录请求
  async login(context, data) {
    try {
      // 请求token
      const token = await login(data)
      // 设置时间戳
      setTimeKey()
      // 根据登录请求 将获取的token 设置给state 进行保存
      context.commit('upDateToken', token)
    } catch (error) {
      // 第一种 return Promise.reject(error)
      return new Promise((res, req) => {
        // 拦截错误
        req(error)
      })
    }
  },
  // 获取用户数据
  async getUserInfo(context) {
    // 获取用户信息
    const results = await getUserInfo()
    // 获取用户头像
    const baseInfo = await getUserDetaiInfoById(results.userId)
    context.commit('updateUserInfo', { ...results, ...baseInfo })
    return results.roles.menus // 大伏笔 将用户对应的角色权限返回给这个方法, 在权限路由守卫里接受信息
  },
  // 退出登录
  logout(context) {
    // 清空token
    context.commit('removeToken')
    // 清空用户数据
    context.commit('removeUserInfo')
    // 重置路由addRoutes
    resetRouter()
    // 重置vuex的routes
    context.commit('premissions/setRoutes', [], { root: true })
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}
